package cn.edu.dgut.sai;

import javax.servlet.AsyncContext;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

/**
 * @author Sai
 *
 * Java EE课程示例
 *
 * curl http://localhost:8080/test/baseAsync 或 在浏览器里输入网址，观察服务器的输出
 *
 * 当终端显示异步Servlet执行完成时，浏览器或curl还没有收到返回。
 *
 * 注意异步线程的名字，它是与servlet的线程名字不一样，但格式是一样的，都属于容器的http线程池。
 */
@WebServlet(value = "/baseAsync", asyncSupported = true)
public class BaseAsyncHelloServlet extends HttpServlet {

    protected void doGet(HttpServletRequest request, HttpServletResponse response) {

        System.out.println("简单异步Servlet执行开始...");
        long start = System.currentTimeMillis();
        System.out.println("进入Servlet线程--" + Thread.currentThread().getName());

        // 启动异步
        AsyncContext asyncContext = request.startAsync();

        // 从容器再分发一个线程去处理
        asyncContext.start(() -> {
            System.out.println("进入异步线程--" + Thread.currentThread().getName());

            new RunningProcessThread().run();

            try {
                response.setContentType("text/html;charset=UTF-8");
                asyncContext.getResponse().getWriter().println("简单异步Servlet示例，Hello World!");
            } catch (IOException e) {
                e.printStackTrace();
            }

            // 结束异步，触发事件，响应客户端
            asyncContext.complete();

            System.out.println("退出异步线程--" + Thread.currentThread().getName());
        });


        long end = System.currentTimeMillis();
        System.out.println("简单异步Servlet执行完成，耗时：" + (end - start) + "毫秒");
        System.out.println("退出Servlet线程--" + Thread.currentThread().getName());
    }

}